View Javadoc

1   package uba.db.table;
2   
3   import java.util.Collections;
4   import java.util.Iterator;
5   import java.util.List;
6   
7   import org.apache.commons.collections.CollectionUtils;
8   import org.apache.commons.collections.TransformerUtils;
9   
10  import uba.db.column.Column;
11  
12  /***
13   * Clase base para facilitar la implementación de la interfaz
14   * {@link uba.db.table.Table}.
15   * 
16   * @version $Revision: 1.6 $
17   */
18  public abstract class TableBehavior implements Table {
19      private String name;
20  
21      private List columns;
22  
23      /***
24       * Las subclases deben llamar a este constructor para crear la estrcutura de
25       * la tabla a partir de un {@link TableSchema}.
26       * 
27       * @param schema
28       *            esquema de la tabla.
29       */
30      public TableBehavior(TableSchema schema) {
31          this.name = schema.tableName();
32          initializeColumnsFrom(schema);
33      }
34  
35      private void initializeColumnsFrom(TableSchema schema) {
36          columns = (List) CollectionUtils
37                  .collect(schema.columnSpecifications(), TransformerUtils
38                          .invokerTransformer("asColumnFor",
39                                              new Class[] { Table.class },
40                                              new Object[] { this }));
41      }
42  
43      /***
44       * @see uba.db.table.Table#name()
45       */
46      public String name() {
47          return name;
48      }
49  
50      /***
51       * @see uba.db.table.Table#insert(java.lang.Object[])
52       */
53      public void insert(Object[] values) throws IllegalArgumentException, InsertException {
54          insertRow(new Row(this, values));
55      }
56  
57      /***
58       * @see uba.db.table.Table#columns()
59       */
60      public List columns() {
61          return Collections.unmodifiableList(columns);
62      }
63  
64      /***
65       * Las sub-clases deben implementar este método para insertar una fila en la
66       * tabla.
67       * 
68       * @param row
69       *            fila a insertar.
70       */
71      protected abstract void insertRow(Row row) throws InsertException;
72  
73      /***
74       * @see uba.db.table.Table#numberOfColumns()
75       */
76      public int numberOfColumns() {
77          return columns.size();
78      }
79  
80      /***
81       * @see uba.db.table.Table#columnNamed(java.lang.String)
82       */
83      public Column columnNamed(String columnName) {
84          // se convierte a base 0
85          return (Column) columns.get(indexOfColumnNamed(columnName) - 1);
86      }
87  
88      /***
89       * Da el indice en base 0 para poder hacer cálculos al construir resultados.
90       * 
91       * @param columnName
92       *            el nombre de la columna
93       * @return el indice en base 1, 0 si no existe en la tabla.
94       */
95      public int indexOfColumnNamed(String columnName) {
96          int i = 0;
97          Iterator it = columns.iterator();
98          Column result = null;
99          while (it.hasNext() && (result == null)) {
100             i++;
101             Column col = (Column) it.next();
102             if (col.name().equalsIgnoreCase(columnName)) {
103                 result = col;
104             }
105         }
106         return i;
107     }
108 }